import * as https from 'https';

export class TranslationService {
    private static readonly API_URL = 'https://api.siliconflow.cn/v1/chat/completions';
    private static apiKey: string = ''; // 需要用户配置自己的API密钥
    private static aiModel: string = 'Qwen/Qwen2.5-7B-Instruct'; // 默认AI模型

    // 根据不同的命名方式生成不同的提示词
    private static getPrompt(text: string, targetCase: string): string {
        const prompts: { [key: string]: string } = {
            camelCase: `请将以下中文文本翻译成英文，并转换为驼峰命名法（camelCase）格式。只返回转换后的结果，不要包含任何解释或其他内容。

示例：
输入：获取用户信息
输出：getUserInfo

输入：创建新订单
输出：createNewOrder

现在请翻译：${text}`,

            PascalCase: `请将以下中文文本翻译成英文，并转换为大驼峰命名法（PascalCase）格式。只返回转换后的结果，不要包含任何解释或其他内容。

示例：
输入：用户管理器
输出：UserManager

输入：订单服务
输出：OrderService

现在请翻译：${text}`,

            snake_case: `请将以下中文文本翻译成英文，并转换为下划线命名法（snake_case）格式。只返回转换后的结果，不要包含任何解释或其他内容。

示例：
输入：获取用户信息
输出：get_user_info

输入：创建新订单
输出：create_new_order

现在请翻译：${text}`,

            'kebab-case': `请将以下中文文本翻译成英文，并转换为短横线命名法（kebab-case）格式。只返回转换后的结果，不要包含任何解释或其他内容。

示例：
输入：获取用户信息
输出：get-user-info

输入：创建新订单
输出：create-new-order

现在请翻译：${text}`,

            default: `请将以下中文文本翻译成英文，适合用作编程中的变量名或函数名。只返回翻译后的英文，不要包含任何解释或其他内容。

示例：
输入：获取用户信息
输出：get user info

输入：创建新订单  
输出：create new order

现在请翻译：${text}`
        };

        return prompts[targetCase] || prompts.default;
    }

    public static async translate(text: string, targetCase: string = 'default', model?: string): Promise<string> {
        if (!this.apiKey) {
            throw new Error('请先配置SiliconFlow API密钥');
        }

        const currentModel = model || this.aiModel;
        const prompt = this.getPrompt(text, targetCase);

        const requestBody = JSON.stringify({
            model: currentModel,
            messages: [
                {
                    role: "user",
                    content: prompt
                }
            ],
            stream: false,
            max_tokens: 512,
            temperature: 0.3, // 降低温度以获得更一致的结果
            top_p: 0.7,
            frequency_penalty: 0.5,
            n: 1,
            response_format: {
                type: "text"
            }
        });

        const url = new URL(this.API_URL);
        const options = {
            hostname: url.hostname,
            path: url.pathname,
            method: 'POST',
            headers: {
                'Authorization': `Bearer ${this.apiKey}`,
                'Content-Type': 'application/json',
                'Content-Length': Buffer.byteLength(requestBody)
            }
        };

        return new Promise((resolve, reject) => {
            const req = https.request(options, (res) => {
                let data = '';

                res.on('data', (chunk) => {
                    data += chunk;
                });

                res.on('end', () => {
                    try {
                        const response = JSON.parse(data);

                        if (response.choices && response.choices.length > 0) {
                            const content = response.choices[0].message?.content?.trim();
                            if (content) {
                                resolve(content);
                            } else {
                                reject(new Error('API返回内容为空'));
                            }
                        } else if (response.error) {
                            reject(new Error(response.error.message || '翻译失败'));
                        } else {
                            reject(new Error('API返回格式不正确'));
                        }
                    } catch (error) {
                        reject(new Error('解析API响应失败'));
                    }
                });
            });

            req.on('error', (error) => {
                reject(new Error(`网络请求失败: ${error.message}`));
            });

            req.write(requestBody);
            req.end();
        });
    }

    public static setApiKey(apiKey: string) {
        this.apiKey = apiKey;
    }

    public static setAiModel(model: string) {
        this.aiModel = model;
    }

    public static getAiModel(): string {
        return this.aiModel;
    }
} 